from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client
from django.utils import timezone
from rest_framework import serializers
from rest_framework.exceptions import ValidationError


# class FastDFSStorage(Storage):
#     """自定义文件存储类"""
#
#     def _open(self, name, mode='rb'):
#         """
#         当要打开某个文件时就会自动调用此方法
#         :param name: 要打开的文件名
#         :param mode: 打开文件模式 二进制读取
#         :return: 打开的文件对象
#         """
#         # 保存本地
#         return None
#
#     def _save(self, name, content):
#         """
#         当上传文件时,就会自动调用此方法
#         :param name: 文件名
#         :param content: 被读取出来的文件二进制数据
#         :return: file_id
#         """
#         conn = Fdfs_client(settings.FDFS_CONF_PATH)
#         res = conn.upload_by_buffer(content.read())
#         if res['status'] != 'Upload successed':
#             raise ValidationError('文件上传fdfs失败')
#         return  res['Pemote file_id']
#
#
#
#     def url(self, name):
#         """
#         当调用image字典的url属性时就会自动调用此方法获取要下载图片的绝对路径
#         :param name: file_id
#         :return: 图片绝对路径: http://192.168.103.210:8888/ + file_id
#         """
#         # return 'http://192.168.206.128:8888/' + name
#         return settings.FDFS_BASE_URL + name
#
#     def exists(self, name):
#         """
#         校验上传的本地文件是否存在
#         :param name:
#         :return:
#         """
#         return False


class FastDFSStorage(Storage):
    def _open(self, name, mode='rb'):
        """
        保存本地
        :param name: 本地打开的文件名
        :param mode: 权限
        :return: 本地文件对象
        """
        # 我们业务中，文件是上传fdsf，不需要打开本地
        return None

    def _save(self, name, content, max_length=None):
        """
        自定义文件保存逻辑
        :param name: 本地打开的文件名字
        :param content: 反序列化校验后得到的字段文件对象
        :param max_length: 最大长度
        :return: 文件的标识（将来是用来存储到mysql中的）
        """
        conn = Fdfs_client(settings.FDFS_CONF_PATH)
        res = conn.upload_by_buffer(content.read())
        if res['Status'] != 'Upload successed.':
            raise ValidationError("文件上传fdfs失败！")

        return res['Remote file_id']

    def url(self, name):
        # http://192.168.203.151:8888/group1/M00/00/02/CtM3BVrPB4GAWkTlAAGuN6wB9fU4220429
        return settings.FDFS_BASE_URL + name

    def exists(self, name):
        """
        判断上传的"本地文件"是否存在：之前是不是已经上传了
        :param name: 本地保存的文件名
        :return: True代表文件已经上传，False代表文件未上传
        """

        # 无需检验问价你是否冲突，直接调用save方法进行fdfs文件上传操作
        return False